#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//
//int int_compare(const void* a, const void* b)
//{
//	return (*(int*)a - *(int*)b);
//}
//
//
//int main()
//{
//	int arr[] = { 3,23,5,56,8,468,56,7,546,76,57,38,798,57,8,45,34,845,8, };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), int_compare);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//	return 0;
//}



//
//int char_compare(const void* a, const void* b)
//{
//	int c = strcmp((char*)a, (char*)b);
//	return c;
//}
//
//int main()
//{
//	int arr[] = { 'd','s','w','t','e','r'};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), char_compare);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%c ", *(arr + i));
//	}
//	return 0;
//}




//struct Stu
//{
//	char name[20];
//	int age;
//};
//
//int int_compare(const void* a, const void* b)
//{
//	return (((struct Stu *)a)->age - ((struct Stu*)b)->age);
//}
//
//int char_compare(const void* a, const void* b)
//{
//	int c = strcmp(((struct Stu*)a)->name, ((struct Stu*)b)->name);
//	return c;
//}
//
//int main()
//{
//	struct Stu s1 = { "zhangsan",20 };
//	struct Stu s2 = { "lisi",19 };
//	struct Stu s3 = { "wangwu", 18 };
//	struct Stu s[] = { s1,s2,s3 };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), int_compare);
//	
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s %d \n", (s + i)->name, (s + i)->age);
//	}
//	printf("\n");
//	qsort(s, sz, sizeof(s[0]), char_compare);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s %d \n", (s + i)->name, (s + i)->age);
//	}
//	return 0;
//}






//int int_compare(const void* a, const void* b)
//{
//	return (*(int*)a - *(int*)b);
//}


int swap(char* a, char* b, size_t size)
{
	for(int i = 0; i < size; i++)
	{
		char tmp = *(a + i * size);
		*(a + i * size) = *(b + i * size);
		*(b + i * size) = tmp;
		
	}
}


void my_qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		int j = 0;
		for (j = 0; j < num - i; j++)
		{
			if (compare((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

//int main()
//{
//	int arr[] = { 3,23,5,56,8,468,56,7,546,76,57,38,798,57,8,45,34,845,8, };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	my_qsort(arr, sz, sizeof(arr[0]), int_compare);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//	return 0;
//}





struct Stu
{
	char name[20];
	int age;
};

int int_compare(const void* a, const void* b)
{
	return (((struct Stu*)a)->age - ((struct Stu*)b)->age);
}

int char_compare(const void* a, const void* b)
{
	int c = strcmp(((struct Stu*)a)->name, ((struct Stu*)b)->name);
	return c;
}

int main()
{
	struct Stu s1 = { "zhangsan",20 };
	struct Stu s2 = { "lisi",19 };
	struct Stu s3 = { "wangwu", 18 };
	struct Stu s[] = { s1,s2,s3 };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), int_compare);

	for (int i = 0; i < sz; i++)
	{
		printf("%s %d \n", (s + i)->name, (s + i)->age);
	}
	printf("\n");
	my_qsort(s, sz, sizeof(s[0]), char_compare);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d \n", (s + i)->name, (s + i)->age);
	}
	return 0;
}